
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from email import encoders
from email.header import Header
from email.mime.text import MIMEText
from email.utils import parseaddr, formataddr

import smtplib

'''
SMTP是发送邮件的协议，Python内置对SMTP的支持，
可以发送纯文本邮件、HTML邮件以及带附件的邮件。

Python对SMTP支持有smtplib和email两个模块，
email负责构造邮件，smtplib负责发送邮件。
'''

'''
注意到构造MIMEText对象时，
第一个参数就是邮件正文，
第二个参数是MIME的subtype，
传入'plain'表示纯文本，最终的MIME就是'text/plain'，
最后一定要用utf-8编码保证多语言兼容性。
'''

msg = MIMEText('hello, send by Python...', 'plain', 'utf-8')


# 输入Email地址和口令:
from_addr = input('From:834889737@qq.com')
password = input('Password:')
# 输入收件人地址:
to_addr = input('To:')
# 输入SMTP服务器地址:
smtp_server = input('SMTP server:smtp.qq.com')


server = smtplib.SMTP(smtp_server, 25) # SMTP协议默认端口是25
server.set_debuglevel(1)
server.login(from_addr, password)
server.sendmail(from_addr, [to_addr], msg.as_string())
server.quit()

'''
我们用set_debuglevel(1)就可以打印出和SMTP服务器交互的所有信息。
SMTP协议就是简单的文本命令和响应。
login()方法用来登录SMTP服务器，
sendmail()方法就是发邮件，
由于可以一次发给多个人，所以传入一个list，
邮件正文是一个str，as_string()把MIMEText对象变成str。
'''


'''
邮件主题、如何显示发件人、
收件人等信息并不是通过SMTP协议发给MTA，而是包含在发给MTA的文本中的，
所以，我们必须把From、To和Subject添加到MIMEText中，才是一封完整的邮件：
'''


def _format_addr(s):
    name, addr = parseaddr(s)
    return formataddr((Header(name, 'utf-8').encode(), addr))

#from_addr = input('From: ')
#password = input('Password: ')
#to_addr = input('To: ')
#smtp_server = input('SMTP server: ')

msg = MIMEText('hello, send by Python...', 'plain', 'utf-8')
msg['From'] = _format_addr('Python爱好者 <%s>' % from_addr)
msg['To'] = _format_addr('管理员 <%s>' % to_addr)
msg['Subject'] = Header('来自SMTP的问候……', 'utf-8').encode()

server = smtplib.SMTP(smtp_server, 25)
server.set_debuglevel(1)
server.login(from_addr, password)
server.sendmail(from_addr, [to_addr], msg.as_string())
server.quit()

'''
发送附件
如果Email中要加上附件怎么办？
带附件的邮件可以看做包含若干部分的邮件：文本和各个附件本身，
所以，可以构造一个MIMEMultipart对象代表邮件本身，
然后往里面加上一个MIMEText作为邮件正文，再继续往里面加上表示附件的MIMEBase对象即可：
'''
# 邮件对象:
msg = MIMEMultipart()
msg['From'] = _format_addr('Python爱好者 <%s>' % from_addr)
msg['To'] = _format_addr('管理员 <%s>' % to_addr)
msg['Subject'] = Header('来自SMTP的问候……', 'utf-8').encode()

# 邮件正文是MIMEText:
msg.attach(MIMEText('send with file...', 'plain', 'utf-8'))

# 添加附件就是加上一个MIMEBase，从本地读取一个图片:
with open('/test.png', 'rb') as f:
    # 设置附件的MIME和文件名，这里是png类型:
    mime = MIMEBase('image', 'png', filename='test.png')
    # 加上必要的头信息:
    mime.add_header('Content-Disposition', 'attachment', filename='test.png')
    mime.add_header('Content-ID', '<0>')
    mime.add_header('X-Attachment-Id', '0')
    # 把附件的内容读进来:
    mime.set_payload(f.read())
    # 用Base64编码:
    encoders.encode_base64(mime)
    # 添加到MIMEMultipart:
    msg.attach(mime)